package com.cs.beneficios.business.entity;

import com.cs.beneficios.business.model.SubprogramaSedeVO;
import com.cs.beneficios.common.ConnectionFactory;

import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;

import java.util.ArrayList;
import java.util.Collection;

public class SubprogramaSedeDAO {
	/**
	 * Conexion a la base de datos.
	 */
	private Connection conn = null;
	private ConnectionFactory cf;

	/**
	 * Constructor que inicializa la conexion con la base de datos.
	 * 
	 * @param conn
	 *            Conexion con la base de datos.
	 */
	public SubprogramaSedeDAO(ConnectionFactory cf) {
		this.cf = cf;
		try {
			this.conn = this.cf.getConnection();
		} catch (SQLException e) {
		}
	}

	public Collection getSubprogramaSede(SubprogramaSedeVO criterea)
			throws SQLException {
		String query = "SELECT SUBSEDE.CODIGO CODE, TO_CHAR(SUBSEDE.DESDE,'DD/MM/YYYY') DESDE, "
				+ "TO_CHAR(SUBSEDE.HASTA,'DD/MM/YYYY') HASTA, "
				+ "SUBSEDE.NUMERO_BENEFICIO, SUBSEDE.NUMERO_BEN_DISPONIBLE, "
				+ "SEDE.CODIGO CODESEDE, SEDE.NOMBRE NOMBRESEDE, "
				+ "SUBPRO.CODIGO CODESUBPROGRAMA, SUBPRO.NOMBRE NOMBRESUBPROGRAMA, "
				+ "PRO.CODIGO CODEPROGRAMA, PRO.NOMBRE NOMBREPROGRAMA "
				+ "FROM TCS_BEN_SUBPROGRAMA_SEDE SUBSEDE, "
				+ "TCS_BEN_SEDE SEDE, "
				+ "TCS_BEN_SUBPROGRAMA SUBPRO, "
				+ "TCS_BEN_PROGRAMA PRO "
				+ "WHERE SEDE.CODIGO = SUBSEDE.SEDE_CODIGO "
				+ "AND SUBPRO.CODIGO = SUBSEDE.SBPR_CODIGO "
				+ "AND SUBPRO.PRG_CODIGO =  PRO.CODIGO ";

		if ((Object) criterea.getCodeSede() != null) {
			query += " AND SEDE.CODIGO = " + criterea.getCodeSede();
		}
		if ((Object) criterea.getCodeSubprograma() != null) {
			query += " AND SUBPRO.CODIGO = " + criterea.getCodeSubprograma();
		}
		if ((Object) criterea.getCodePrograma() != null) {
			query += " AND PRO.CODIGO = " + criterea.getCodePrograma();
		}

		query += " ORDER BY PRO.NOMBRE,SUBPRO.NOMBRE,DESDE DESC, SEDE.NOMBRE ";
		ResultSet rst = null;
		ArrayList lsubsede = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubprogramaSedeVO subsedeVO = null;
		while (rst.next()) {
			subsedeVO = new SubprogramaSedeVO();
			subsedeVO.setCode(new Long(rst.getLong("CODE")));
			subsedeVO.setCodeSede(new Long(rst.getLong("CODESEDE")));
			subsedeVO.setNombreSede(rst.getString("NOMBRESEDE"));
			subsedeVO.setCodePrograma(new Long(rst.getLong("CODEPROGRAMA")));
			subsedeVO.setNombrePrograma(rst.getString("NOMBREPROGRAMA"));
			subsedeVO.setCodeSubprograma(new Long(rst
					.getLong("CODESUBPROGRAMA")));
			subsedeVO.setNombreSubprograma(rst.getString("NOMBRESUBPROGRAMA"));
			subsedeVO.setDesde(rst.getString("DESDE"));
			subsedeVO.setHasta(rst.getString("HASTA"));
			subsedeVO.setCantidadTotal(rst.getString("NUMERO_BENEFICIO"));
			subsedeVO.setCantidadDisponible(rst
					.getString("NUMERO_BEN_DISPONIBLE"));
			lsubsede.add(subsedeVO);
			subsedeVO = null;
		}
		rst.close();
		return lsubsede;
	}

	public Collection getSubproSede(String codesubprosede) throws SQLException {
		int iCodeSubproSede = Integer.parseInt(codesubprosede);
		String query = "SELECT SUBSEDE.CODIGO CODE, TO_CHAR(SUBSEDE.DESDE,'DD/MM/YYYY') DESDE, "
				+ "TO_CHAR(SUBSEDE.HASTA,'DD/MM/YYYY') HASTA, "
				+ "SUBSEDE.NUMERO_BENEFICIO, SUBSEDE.NUMERO_BEN_DISPONIBLE, "
				+ "SEDE.CODIGO CODESEDE, SEDE.NOMBRE NOMBRESEDE, "
				+ "SUBPRO.CODIGO CODESUBPROGRAMA, SUBPRO.NOMBRE NOMBRESUBPROGRAMA, "
				+ "PRO.CODIGO CODEPROGRAMA, PRO.NOMBRE NOMBREPROGRAMA "
				+ "FROM TCS_BEN_SUBPROGRAMA_SEDE SUBSEDE, "
				+ "TCS_BEN_SEDE SEDE, "
				+ "TCS_BEN_SUBPROGRAMA SUBPRO, "
				+ "TCS_BEN_PROGRAMA PRO "
				+ "WHERE SEDE.CODIGO = SUBSEDE.SEDE_CODIGO "
				+ "AND SUBPRO.CODIGO = SUBSEDE.SBPR_CODIGO "
				+ "AND SUBPRO.PRG_CODIGO =  PRO.CODIGO "
				+ "AND SUBSEDE.CODIGO=" + iCodeSubproSede + " ";

		query += " ORDER BY PRO.NOMBRE,SUBPRO.NOMBRE,DESDE DESC, SEDE.NOMBRE ";
		ResultSet rst = null;
		ArrayList lsubsede = new ArrayList();
		rst = cf.getRecordsRset(query, null, conn);
		SubprogramaSedeVO subsedeVO = null;
		while (rst.next()) {
			subsedeVO = new SubprogramaSedeVO();
			subsedeVO.setCode(new Long(rst.getLong("CODE")));
			subsedeVO.setCodeSede(new Long(rst.getLong("CODESEDE")));
			subsedeVO.setNombreSede(rst.getString("NOMBRESEDE"));
			subsedeVO.setCodePrograma(new Long(rst.getLong("CODEPROGRAMA")));
			subsedeVO.setNombrePrograma(rst.getString("NOMBREPROGRAMA"));
			subsedeVO.setCodeSubprograma(new Long(rst
					.getLong("CODESUBPROGRAMA")));
			subsedeVO.setNombreSubprograma(rst.getString("NOMBRESUBPROGRAMA"));
			subsedeVO.setDesde(rst.getString("DESDE"));
			subsedeVO.setHasta(rst.getString("HASTA"));
			subsedeVO.setCantidadTotal(rst.getString("NUMERO_BENEFICIO"));
			subsedeVO.setCantidadDisponible(rst
					.getString("NUMERO_BEN_DISPONIBLE"));
			lsubsede.add(subsedeVO);
			subsedeVO = null;
		}
		rst.close();
		return lsubsede;
	}

	public void insertUsuarioSede(Long codeSubprogramaSede, Long codeUser,
			String param[]) throws SQLException {
		String query = "select codigo from TCS_BEN_USUARIO_SEDE "
				+ "where usu_codigo = " + codeUser + " and spse_codigo = "
				+ codeSubprogramaSede;
		ResultSet rst = null;
		rst = cf.getRecordsRset(query, null, conn);
		if (!rst.next()) {
			query = "INSERT INTO TCS_BEN_USUARIO_SEDE "
					+ "(CODIGO, USU_CODIGO, SPSE_CODIGO, "
					+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
					+ "VALUES (SCS_BEN_USE.nextval,"
					+ codeUser
					+ ","
					+ codeSubprogramaSede
					+ ",?,to_date(?,'dd/mm/yyyy'),?,?,to_date(?,'dd/mm/yyyy'),?)";
			int iRegInsert = cf.execSql(query, param, conn);
		}
	}

	public String[] insertSubprogramaSede(Long codeSede, Long codeSubprograma,
			String desde, String hasta, String cantidad, String param[])
			throws SQLException {
		String retorno[] = new String[2];
		retorno[0] = "false";
		int validate1 = validateExist(codeSede, codeSubprograma, desde, hasta);
		if (validate1 == 0) {
			if (validateExist(codeSede, codeSubprograma)) {
				String validate[] = validateDates(codeSede, codeSubprograma,
						desde);
				if (validate[0].equals("true")) {
					String query = "INSERT INTO TCS_BEN_SUBPROGRAMA_SEDE "
							+ "(CODIGO, SEDE_CODIGO, SBPR_CODIGO, "
							+ "DESDE, HASTA, NUMERO_BENEFICIO, "
							+ "NUMERO_BEN_DISPONIBLE, "
							+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
							+ "VALUES (SCS_BEN_SPSE.nextval,?,?,"
							+ "to_date(?,'dd/mm/yyyy'),to_date(?,'dd/mm/yyyy'),?,?,?,to_date(?,'dd/mm/yyyy'),?,?,to_date(?,'dd/mm/yyyy'),?)";
					String strArr[] = { codeSede.toString(),
							codeSubprograma.toString(), desde, hasta, cantidad,
							cantidad, param[0], param[1], param[2], param[3],
							param[4], param[5] };
					int iRegInsert = cf.execSql(query, strArr, conn);
					if (iRegInsert > 0) {
						retorno[0] = "true";
						query = "select max(codigo) codigo from TCS_BEN_SUBPROGRAMA_SEDE";
						ResultSet rst = cf.getRecordsRset(query, null, conn);
						if (rst.next()) {
							retorno[1] = rst.getString("codigo");
						}
					} else {
						retorno[0] = "false";
					}
				} else {
					if ((Object) validate[1] != null) {
						retorno[0] = "ususede"; // indica que solo se debe
												// insertar
						retorno[1] = validate[1];
					} else {
						retorno[1] = "Ese beneficio ya esta cubierto en ese periodo de tiempo, seleccione otro rango!";
					}
				}
			} else {
				String query = "INSERT INTO TCS_BEN_SUBPROGRAMA_SEDE "
						+ "(CODIGO, SEDE_CODIGO, SBPR_CODIGO, "
						+ "DESDE, HASTA, NUMERO_BENEFICIO, "
						+ "NUMERO_BEN_DISPONIBLE, "
						+ " usuario_crea, fecha_crea, terminal_crea, usuario_modifica, fecha_modifica, terminal_modifica) "
						+ "VALUES (SCS_BEN_SPSE.nextval,?,?,"
						+ "to_date(?,'dd/mm/yyyy'),to_date(?,'dd/mm/yyyy'),?,?,?,to_date(?,'dd/mm/yyyy'),?,?,to_date(?,'dd/mm/yyyy'),?)";
				String strArr[] = { codeSede.toString(),
						codeSubprograma.toString(), desde, hasta, cantidad,
						cantidad, param[0], param[1], param[2], param[3],
						param[4], param[5] };
				int iRegInsert = cf.execSql(query, strArr, conn);
				if (iRegInsert > 0) {
					retorno[0] = "true";
					query = "select max(codigo) codigo from TCS_BEN_SUBPROGRAMA_SEDE";
					ResultSet rst = cf.getRecordsRset(query, null, conn);
					if (rst.next()) {
						retorno[1] = rst.getString("codigo");
					}
				} else {
					retorno[0] = "false";
				}
			}
		} else {
			retorno[0] = "ususede";// "La sede seleccionada ya tiene asignado ese beneficio en el mismo periodo de tiempo";
			retorno[1] = validate1 + "";
		}
		return retorno;
	}

	public int validateExist(Long codeSede, Long codeSubprograma, String desde,
			String hasta) throws SQLException {
		String query = "select codigo from TCS_BEN_SUBPROGRAMA_SEDE "
				+ "where sede_codigo = " + codeSede + " and sbpr_codigo = "
				+ codeSubprograma + " and desde = to_date('" + desde
				+ "','dd/mm/yyyy')" + " and hasta = to_date('" + hasta
				+ "','dd/mm/yyyy')";
		ResultSet rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			return rst.getInt("codigo");
		} else {
			return 0;
		}
	}

	public boolean validateExist(Long codeSede, Long codeSubprograma)
			throws SQLException {
		String query = "select codigo from TCS_BEN_SUBPROGRAMA_SEDE "
				+ "where sede_codigo = " + codeSede + " and sbpr_codigo = "
				+ codeSubprograma;
		ResultSet rst = cf.getRecordsRset(query, null, conn);
		if (rst.next()) {
			rst.close();
			return true;
		} else {
			rst.close();
			return false;
		}
	}

	public String[] validateDates(Long codeSede, Long codeSubprograma,
			String desde) throws SQLException {
		String query = "select case when hasta < to_date('"
				+ desde
				+ "','dd/mm/yyyy') then 'true' "
				+ "else 'false' "
				+ "end validacion, codigo "
				+ "from tcs_ben_subprograma_sede "
				+ "where codigo =  (select max(codigo) from tcs_ben_subprograma_sede "
				+ "where sbpr_codigo = " + codeSubprograma
				+ " and sede_codigo = " + codeSede + ")";
		ResultSet rst = cf.getRecordsRset(query, null, conn);
		String retorno[] = new String[2];
		if (rst.next()) {
			String test = rst.getString("validacion");
			retorno[0] = test;
			retorno[1] = rst.getString("codigo");
			rst.close();
		} else {
			retorno[0] = "false";
			rst.close();
		}
		return retorno;
	}

	public boolean actualizarSubproSede(String codebenesede, String parArr[])
			throws SQLException {
		int code = Integer.parseInt(codebenesede.trim());
		String query = "UPDATE TCS_BEN_SUBPROGRAMA_SEDE SET "
				+ "SEDE_CODIGO = ?, " + "DESDE = to_date(?,'dd/mm/yyyy'), "
				+ "HASTA = to_date(?,'dd/mm/yyyy'), "
				+ "NUMERO_BENEFICIO = NUMERO_BENEFICIO + ?, "
				+ "NUMERO_BEN_DISPONIBLE = NUMERO_BEN_DISPONIBLE + ?, "
				+ "usuario_modifica = ?,"
				+ "fecha_modifica = to_date(?,'dd/mm/yyyy'), "
				+ "terminal_modifica = ? " + "WHERE CODIGO = " + code;
		int i = cf.execSql(query, parArr, conn);
		if (i > 0)
			return true;
		else
			return false;
	}

	public Connection getConn() {
		return conn;
	}
}